import { useState, useCallback } from 'react';

interface UseBase64Options {
  urlSafe?: boolean;
}

export const useBase64 = (options: UseBase64Options = {}) => {
  const { urlSafe = false } = options;
  
  const [inputContent, setInputContent] = useState<string>('');
  const [outputContent, setOutputContent] = useState<string>('');
  const [error, setError] = useState<string>('');

  // 检查字符串是否可能是Base64编码
  const isBase64 = useCallback((str: string): boolean => {
    // 移除可能的URL安全字符
    const normalizedStr = str.replace(/-/g, '+').replace(/_/g, '/');
    
    // 基本检查：长度必须是4的倍数（可能有填充）
    if (normalizedStr.length % 4 !== 0 && !normalizedStr.endsWith('=')) {
      return false;
    }
    
    // 检查是否只包含Base64允许的字符
    const base64Regex = urlSafe 
      ? /^[A-Za-z0-9\-_]*={0,2}$/
      : /^[A-Za-z0-9+/]*={0,2}$/;
    
    if (!base64Regex.test(normalizedStr)) {
      return false;
    }
    
    // 尝试解码，如果成功则可能是Base64
    try {
      // 对于非常长的字符串，我们只检查一部分
      const testStr = normalizedStr.length > 1000 
        ? normalizedStr.substring(0, 1000) 
        : normalizedStr;
      
      atob(testStr.replace(/=/g, ''));
      return true;
    } catch (e) {
      return false;
    }
  }, [urlSafe]);

  // 自动检测并处理
  const autoDetectAndProcess = useCallback(() => {
    try {
      setError('');
      if (!inputContent.trim()) {
        setOutputContent('');
        return;
      }

      // 检测输入是否为Base64
      if (isBase64(inputContent.trim())) {
        // 看起来是Base64，尝试解码
        decodeFromBase64();
      } else {
        // 不是Base64，进行编码
        encodeToBase64();
      }
    } catch (err) {
      setError('自动处理失败: ' + (err instanceof Error ? err.message : String(err)));
      setOutputContent('');
    }
  }, [inputContent, isBase64]);

  const encodeToBase64 = useCallback(() => {
    try {
      setError('');
      if (!inputContent.trim()) {
        setOutputContent('');
        return;
      }

      // 编码为Base64
      let encoded = btoa(unescape(encodeURIComponent(inputContent)));
      
      // 如果需要URL安全的Base64
      if (urlSafe) {
        encoded = encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
      }
      
      setOutputContent(encoded);
    } catch (err) {
      setError('编码失败: ' + (err instanceof Error ? err.message : String(err)));
      setOutputContent('');
    }
  }, [inputContent, urlSafe]);

  const decodeFromBase64 = useCallback(() => {
    try {
      setError('');
      if (!inputContent.trim()) {
        setOutputContent('');
        return;
      }

      let base64Str = inputContent.trim();
      
      // 如果是URL安全的Base64，先转换回标准Base64
      if (urlSafe) {
        // 替换URL安全字符
        base64Str = base64Str.replace(/-/g, '+').replace(/_/g, '/');
        
        // 添加回可能被移除的填充字符
        while (base64Str.length % 4) {
          base64Str += '=';
        }
      }
      
      // 解码Base64
      const decoded = decodeURIComponent(escape(atob(base64Str)));
      setOutputContent(decoded);
    } catch (err) {
      setError('解码失败: ' + (err instanceof Error ? err.message : String(err)));
      setOutputContent('');
    }
  }, [inputContent, urlSafe]);

  const copyResult = useCallback(() => {
    if (outputContent) {
      navigator.clipboard.writeText(outputContent);
    }
  }, [outputContent]);

  const clearAll = useCallback((outputOnly = false) => {
    if (!outputOnly) {
      setInputContent('');
    }
    setOutputContent('');
    setError('');
  }, []);

  const loadExample = useCallback(() => {
    const example = 'Hello, World! 这是一个Base64编码解码示例。\n支持中文和特殊字符：@#$%^&*()';
    setInputContent(example);
    setOutputContent('');
    setError('');
  }, []);

  return {
    inputContent,
    outputContent,
    error,
    setInputContent,
    encodeToBase64,
    decodeFromBase64,
    copyResult,
    clearAll,
    autoDetectAndProcess,
    loadExample
  };
};